package cn.imokay.oom;

public class StringInternTest {
    public static void main(String[] args) {
        String s = new StringBuilder("hello ").append("world").toString();
        /**
         *  jak6:false
         *  StringBuilder创建的对象位于堆,
         *  intern方法执行首次遇到的字符串会将堆中的字符串实例复制到永久代,
         *  并返回实例引用,所以是两个不同的对象
         */

        /**
         * jdk7及以上:true
         * StringBuilder创建的对象位于堆
         * 常量池也位于堆,intern方法执行不需要复制对象,
         * 只需要记录首次碰到的字符串对象的引用到常量池,
         * 返回的还是原对象的引用,所以是同一个对象
         */
        System.out.println(s.intern() == s);

        /**
         * jdk7及以上String::intern()介绍:
         * 若首次碰到该字符串,则记录该字符串的引用到常量池,
         * 否则直接返回常量池中之前出现过的对象的引用
         */

        String s1 = new String("qwert");
        String s11 = s1.intern();

        String s2 = new String("qwert");
        String s22 = s2.intern();
        System.out.println("s1 == s2:"+(s1 == s2));//fase
        System.out.println("s11 == s22:"+(s11 == s22));//true
    }
}
